#!/bin/bash

# ========================================
# Docker 完全清理脚本
# ========================================
# 功能说明：
# 1. 停止并删除所有 Docker 容器（运行中 + 停止的）
# 2. 删除所有 Docker 镜像
# 3. 清理未使用的 Docker 网络
# 4. 删除所有 Docker 卷
# 
# 警告：此脚本将清空所有 Docker 数据，恢复到初始状态！
#
# 使用方法：
#   直接执行: ./docker_clean_all.sh
#   跳过确认: ./docker_clean_all.sh -y
#   通过管道: curl -fsSL <url> | bash -s -- -y
# ========================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色

# 显示Banner
show_banner() {
    echo -e "${BLUE}"
    echo "╔════════════════════════════════════════════════════════╗"
    echo "║                                                        ║"
    echo "║           Docker 完全清理脚本 v1.0                     ║"
    echo "║                                                        ║"
    echo "║  本脚本将执行以下操作：                                ║"
    echo "║  [1] 停止并删除所有容器（运行中 + 停止的）             ║"
    echo "║  [2] 删除所有镜像                                      ║"
    echo "║  [3] 清理未使用的网络                                  ║"
    echo "║  [4] 删除所有卷                                        ║"
    echo "║                                                        ║"
    echo "║  ⚠️  警告：此操作不可逆，将清空所有 Docker 数据！      ║"
    echo "║                                                        ║"
    echo "╚════════════════════════════════════════════════════════╝"
    echo -e "${NC}"
}

# 检查是否为root用户
check_root() {
    if [ "$EUID" -ne 0 ]; then 
        echo -e "${YELLOW}提示：建议使用 root 权限运行此脚本${NC}"
        echo -e "${YELLOW}如遇到权限问题，请使用: sudo $0${NC}"
        echo ""
    fi
}

# 检查Docker是否安装
check_docker() {
    if ! command -v docker &> /dev/null; then
        echo -e "${RED}错误：未检测到 Docker，请先安装 Docker${NC}"
        exit 1
    fi
    echo -e "${GREEN}✓ Docker 已安装${NC}"
}

# 用户确认
confirm_action() {
    # 如果设置了 -y 参数，跳过确认
    if [ "$SKIP_CONFIRM" = "true" ]; then
        echo -e "${YELLOW}检测到 -y 参数，跳过确认直接执行${NC}"
        return 0
    fi
    
    # 检查是否为交互式终端
    if [ ! -t 0 ]; then
        echo -e "${RED}错误：非交互式环境下必须使用 -y 参数来跳过确认${NC}"
        echo -e "${YELLOW}使用方法: curl -fsSL <url> | bash -s -- -y${NC}"
        exit 1
    fi
    
    echo -e "${RED}"
    read -p "确认要清空所有 Docker 数据吗？此操作不可恢复！(yes/no): " confirm
    echo -e "${NC}"
    if [ "$confirm" != "yes" ]; then
        echo -e "${YELLOW}操作已取消${NC}"
        exit 0
    fi
}

# 停止并删除所有容器
remove_containers() {
    echo -e "\n${BLUE}[步骤 1/4] 正在处理容器...${NC}"
    
    # 获取容器数量
    container_count=$(docker ps -aq | wc -l)
    
    if [ "$container_count" -eq 0 ]; then
        echo -e "${YELLOW}  → 没有需要删除的容器${NC}"
    else
        echo -e "${YELLOW}  → 发现 $container_count 个容器${NC}"
        echo -e "  → 正在停止所有运行中的容器..."
        docker stop $(docker ps -q) 2>/dev/null
        
        echo -e "  → 正在删除所有容器..."
        docker rm -f $(docker ps -aq) 2>/dev/null
        
        echo -e "${GREEN}  ✓ 已删除 $container_count 个容器${NC}"
    fi
}

# 删除所有镜像
remove_images() {
    echo -e "\n${BLUE}[步骤 2/4] 正在处理镜像...${NC}"
    
    # 获取镜像数量
    image_count=$(docker images -q | wc -l)
    
    if [ "$image_count" -eq 0 ]; then
        echo -e "${YELLOW}  → 没有需要删除的镜像${NC}"
    else
        echo -e "${YELLOW}  → 发现 $image_count 个镜像${NC}"
        echo -e "  → 正在删除所有镜像..."
        docker rmi -f $(docker images -q) 2>/dev/null
        
        echo -e "${GREEN}  ✓ 已删除 $image_count 个镜像${NC}"
    fi
}

# 清理未使用的网络
remove_networks() {
    echo -e "\n${BLUE}[步骤 3/4] 正在清理网络...${NC}"
    
    echo -e "  → 正在清理未使用的网络..."
    pruned_networks=$(docker network prune -f 2>&1)
    
    if echo "$pruned_networks" | grep -q "Total reclaimed space: 0B"; then
        echo -e "${YELLOW}  → 没有需要清理的网络${NC}"
    else
        echo -e "${GREEN}  ✓ 网络清理完成${NC}"
        echo -e "  ${pruned_networks}" | grep "Deleted Networks:" || true
    fi
}

# 删除所有卷
remove_volumes() {
    echo -e "\n${BLUE}[步骤 4/4] 正在处理卷...${NC}"
    
    # 获取卷数量
    volume_count=$(docker volume ls -q | wc -l)
    
    if [ "$volume_count" -eq 0 ]; then
        echo -e "${YELLOW}  → 没有需要删除的卷${NC}"
    else
        echo -e "${YELLOW}  → 发现 $volume_count 个卷${NC}"
        echo -e "  → 正在删除所有卷..."
        docker volume rm $(docker volume ls -q) 2>/dev/null
        
        echo -e "${GREEN}  ✓ 已删除 $volume_count 个卷${NC}"
    fi
}

# 显示最终统计
show_summary() {
    echo -e "\n${GREEN}╔════════════════════════════════════════╗${NC}"
    echo -e "${GREEN}║                                        ║${NC}"
    echo -e "${GREEN}║     🎉 Docker 清理完成！               ║${NC}"
    echo -e "${GREEN}║                                        ║${NC}"
    echo -e "${GREEN}║     Docker 已恢复到初始状态            ║${NC}"
    echo -e "${GREEN}║                                        ║${NC}"
    echo -e "${GREEN}╚════════════════════════════════════════╝${NC}"
    
    echo -e "\n${BLUE}当前 Docker 状态：${NC}"
    echo -e "  容器数量: $(docker ps -a | wc -l) (不含标题行应为1)"
    echo -e "  镜像数量: $(docker images | wc -l) (不含标题行应为1)"
    echo -e "  网络数量: $(docker network ls | wc -l) (仅保留默认网络)"
    echo -e "  卷数量:   $(docker volume ls | wc -l) (不含标题行应为1)"
    
    # 显示磁盘空间
    echo -e "\n${BLUE}Docker 磁盘使用情况：${NC}"
    docker system df
}

# 主函数
main() {
    # 解析命令行参数
    SKIP_CONFIRM=false
    for arg in "$@"; do
        case $arg in
            -y|--yes)
                SKIP_CONFIRM=true
                shift
                ;;
            -h|--help)
                echo "使用方法: $0 [-y|--yes] [-h|--help]"
                echo "  -y, --yes    跳过确认，直接执行清理"
                echo "  -h, --help   显示此帮助信息"
                exit 0
                ;;
        esac
    done
    
    show_banner
    check_root
    check_docker
    confirm_action
    
    echo -e "\n${BLUE}开始清理 Docker...${NC}\n"
    
    remove_containers
    remove_images
    remove_networks
    remove_volumes
    
    # 最后执行一次系统清理
    echo -e "\n${BLUE}[额外清理] 正在执行系统级清理...${NC}"
    docker system prune -a -f --volumes 2>/dev/null
    echo -e "${GREEN}  ✓ 系统清理完成${NC}"
    
    show_summary
}

# 执行主函数，传递所有参数
main "$@"
